package com.xiyuan.smartutils.tools;

import com.xiyuan.smartutils.Objects;
import com.xiyuan.smartutils.StrUtils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author xiyuan-lgz 2024-08-18 @version v1.0.0 新建与整理
 */
@SuppressWarnings({"AlibabaLowerCamelCaseVariableNaming", "AlibabaAvoidStartWithDollarAndUnderLineNaming"})
public final class KeyTools {
    
    private static final KeyImpl INSTANCE = new KeyImpl();
    
    /**
     * 创建一个随机密钥
     *
     * @return key
     */
    public static String createKey() {
        return createKey(0, null);
    }
    
    
    /**
     * 解析key 内容
     *
     * @param key
     * @return KeyInfo
     */
    public static KeyInfo readKey(String key) {
        return Objects.copyDeep(INSTANCE.readKey(key), new KeyInfo());
    }
    
    /**
     * 创建一个随机密钥
     * 该方法主要用于生成一个基于时间和其他额外数据的唯一键
     *
     * @param seconds 时间戳（秒），用于密钥的过期时长
     * @return 随机密钥
     */
    public static String createKey(long seconds) {
        return createKey(seconds, null);
    }
    
    /**
     * 创建一个随机密钥
     * 该方法主要用于生成一个基于时间和其他额外数据的唯一键
     *
     * @param seconds 时间戳（秒），用于密钥的过期时长
     * @param extra_data 额外数据，用于在键中加入除时间戳外的其他信息
     * @return 随机密钥
     */
    public static String createKey(long seconds, String extra_data) {
        return INSTANCE.createKey(seconds,extra_data);
    }
    
    /**
     * 判断密钥是否 过期
     *
     * @param key key
     * @return boolean
     */
    public static boolean isExpired(String key) {
        return INSTANCE.readKey(key).isEnabled();
    }
    
 
    
    public static class KeyInfo {
        
        /**
         * key 请求 有效时长
         */
        protected long req;
        /**
         * 注册时间
         */
        protected Date beginTime;
        
        /**
         * 结束时间
         */
        protected Date endTime;
        
        /**
         * 是否有效
         */
        protected boolean enabled;
        
        /**
         * 有效时长，单位、秒， 当 = enabled = false 时，表示过期时长
         */
        protected long diff;
        
        /**
         * 负载数据
         */
        protected String data;
        
        public long getReq() {
            return req;
        }
        
        public Date getBeginTime() {
            return beginTime;
        }
        
        public Date getEndTime() {
            return endTime;
        }
        
        public boolean isEnabled() {
            return enabled;
        }
        
        public long getDiff() {
            return diff;
        }
        
        public String getData() {
            return data;
        }
        
        @Override
        public String toString() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String dt = data == null ? null : StrUtils.addEscapeChar(data, '"');
            return new StringBuilder()
                    .append("{")
                    .append("\"req\": ").append(req).append(", ")
                    .append("\"beginTime\": ")
                    .append(beginTime == null ? null : "\"" + sdf.format(beginTime) + "\"").append(", ")
                    .append("\"endTime\": \"")
                    .append(endTime == null ? null : "\"" + sdf.format(endTime) + "\"").append(", ")
                    .append("\"diff\": ").append(diff).append(", ")
                    .append("\"enabled\": ").append(enabled).append(", ")
                    .append("\"data\": ").append(dt == null ? null : "\"" + dt + "\"")
                    .append("}").toString();
        }
    }
}

